package cn.jolyoulu.mqtt.config.mqtt;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Arrays;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;

public class MqttTokenUtils {

    /**
     * 生成普通的 jwtToken
     * @param userName 用户名
     * @param secret 密钥
     * @param timeOut 超时时间
     * @param timeUtil 最小单位秒
     * @return
     */
    public static String createJwtToken(String userName, String secret, Integer timeOut, TimeUnit timeUtil) {
        return createJwtToken(userName,secret,timeUtil.toSeconds(timeOut));
    }

    /**
     * 生成普通的 jwtToken
     * @param userName 用户名
     * @param secret 密钥
     * @param timeOut token超时时长（秒）
     * @return
     */
    public static String createJwtToken(String userName, String secret, Long timeOut) {
        HashMap<String, Object> bodys = new HashMap<>();
        bodys.put("username",userName);
        bodys.put("exp", LocalDateTime.now().plusSeconds(timeOut).toEpochSecond(ZoneOffset.of("+8")));
        //权限
        HashMap<String, Object> acl = new HashMap<>();
        acl.put("pub",Arrays.asList("testtopic/"+userName));
        acl.put("sub",Arrays.asList("testtopic/"+userName));
        bodys.put("acl", acl);
        return Jwts.builder()
                .setClaims(bodys)
                .signWith(SignatureAlgorithm.HS256, secret.getBytes())
                .compact();
    }

    /**
     * 生成无 发布/订阅限制的 jwtToken
     * @param userName 用户名
     * @param secret 密钥
     * @param timeOutDay 超时时间(天)
     * @return
     */
    public static String createAdminJwtToken(String userName, String secret, Integer timeOutDay) {
        HashMap<String, Object> bodys = new HashMap<>();
        bodys.put("username",userName);
        bodys.put("exp", LocalDateTime.now().plusDays(timeOutDay).toEpochSecond(ZoneOffset.of("+8")));
        return Jwts.builder()
                .setClaims(bodys)
                .signWith(SignatureAlgorithm.HS256, secret.getBytes())
                .compact();
    }

    public static Claims getBody(String jwtToken,String secret){
        return Jwts.parser().setSigningKey(secret.getBytes()).parseClaimsJws(jwtToken).getBody();
    }

}
